public class Euler024 {
	//	final static int[] array = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
	final static int MAX = 9;
	final static int[] array = new int[MAX];
	static {
		for (int i = 0; i < MAX; i++) {
			array[i] = i;
		}

	}

	private static void swap(final int[] data, final int i, final int j) {
		int temp = data[i];
		data[i] = data[j];
		data[j] = temp;
	}

	static int m_index = 0;

	private static void recursive(int i, final int N) {
		if (N == i) {
			m_index++;
		} else {
			for (int j = i; j < N; j++) {
				swap(array, i, j);
				recursive(i + 1, N);
				swap(array, i, j);
			}
		}

	}

	public static void main(String[] args) {
		final int n = array.length;
		int check = 1;
		int index = 1;
		final long start = System.currentTimeMillis();
		//		while (check > 0) { // && index < 1000001
		//			index++;
		//			for (int i = n - 2; i >= 0; i--) {
		//				check = 1;
		//				if (array[i] < array[i + 1]) {
		//					if (i == n - 2) {
		//						swap(array, i, n - 1);
		//						break;
		//					} else {
		//						// Find the smallest number that bigger than a[i]
		//						int k;
		//						for (k = n - 1; k > i; k--) {
		//							if (array[k] > array[i])
		//								break;
		//						}
		//						swap(array, i, k);
		//						for (int j = i + 1; j < n; j++) {
		//							for (int m = i + 1; m < n; m++) {
		//								if (array[j] < array[m]) {
		//									swap(array, j, m);
		//								}
		//							}
		//						}
		//						break;
		//					}
		//				} else {
		//					check = 0;
		//				}
		//			}
		//		}
		recursive(0, MAX);
		Common.printArray(array, "");
		System.out
				.println("End after: " + (System.currentTimeMillis() - start));
		System.out.println(m_index);
	}

}
